Integrated circuit devices, commonly known as chips, continue to become more powerful and complex as semiconductor manufacturing technologies have advanced. Whereas early integrated circuit devices included fewer than one hundred transistors, it is now common to integrate hundreds of millions of transistors into a single integrated circuit device. This increased transistor count enables operations that once involved several integrated circuit devices to be implemented in a single integrated circuit device, often providing greater performance at a lower cost. For example, where previously a data processing system might involve separate integrated circuit devices for a microprocessor, a memory, a bus interface, and a memory controller, advances in chip density now permit all of these functions to be integrated into the same integrated circuit device. Such devices are typically known as “systems on a chip” due to the high level of integration.
Increases in chip density have significantly affected the design methodologies used for integrated circuits. Rather than manually laying out individual transistors or logic gates in an integrated circuit design to obtain a desired logic function, functional aspects of the design process are typically separated from the physical aspects.
The functional aspects of a design are addressed via a process known as a logic design (i.e., integrated circuit design), resulting in the generation of a functional definition of a circuit design. The functional definition may be defined in a hardware description language (HDL) such as Very High Speed Integrated Circuit (VHIC) Hardware Description Language (VHDL) or Verilog. An HDL representation of a circuit is analogous in many respects to a software program, as the HDL representation generally defines the logic or functions to be performed by a circuit. By separating logic design from physical layout, functions are capable of being defined at a higher level of abstraction. Many design methodologies rely on hierarchical logic design, where circuits are defined in sub-units and grouped together in one or more units (i.e., parent containers) representing collections of sub-units (i.e., child containers). In hierarchical logic design, logic paths often span from one physical sub-unit (or unit) to another and encounter storage elements (e.g., pipeline stages/latches, registers, etc.) at boundaries of physical sub-units (or units).